home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
WINFONTS
/
FNTPRN.ZIP
/
FNTSRC.ZIP
/
ENUMFONT.C
< prev
next >
Wrap
Text File
|
1993-03-16
|
40KB
|
1,210 lines
// Contents copyright (c) 1993 John Deurbrouck
/*
** Define DEBUG for compilation under Borland C++ 3.1 to get a
** standalone test version of ENUMFONT.C
*/
#ifdef DEBUG
int wanna_quit=0;
#endif
/*
** Includes
*/
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<commdlg.h>
#include<string.h>
#include"enumfont.h"
/*
** Private Defines
*/
#ifdef DEBUG
#define printf mprintf
#endif
#define FONTHASREGULAR 1
#define FONTHASBOLD 2
#define FONTHASITALIC 4
#define FONTHASBOLDITALIC 8
#define FONTISTRUETYPE 16
#define FONTISFIXEDWIDTH 32
#define MAXALLOCATIONS 100
#define ALLOCATIONSIZE 32000
#define MAXFONTS 512
/*
** Type Definitions
*/
// TRACKFONT struct used to store font data
typedef struct tagTRACKFONT{
LPSTR facename;
int flags;
int height;
int width;
int narrowness;
int weight;
BYTE fonttype;
LPSTR regular,bold,italic,bolditalic;
}TRACKFONT,FAR* LPTRACKFONT;
// TEXTQUEUE for linked list of .WRI file data
typedef struct tagTEXTQUEUE{
LPSTR text;
int textlen;
void FAR* next;
}TEXTQUEUE,FAR* LPTEXTQUEUE;
// WRITEFILEHEADER used to write .WRI header
typedef struct tagWRITEFILEHEADER{
int wIdent;
int dty;
int wTool;
int wReserved[4];
long fcMac;
int pnPara;
int pnFntb;
int pnSep;
int pnSetb;
int pnPgtb;
int pnFfntb;
int szSsht[33];
int pnMac;
int wReserved2[15];
}WRITEFILEHEADER,FAR* LPWRITEFILEHEADER;
// FOD for .WRI file generation
typedef struct tagFOD{
long fcLim;
int bfprop;
}FOD,FAR* LPFOD;
// PAP for .WRI file paragraph data
typedef struct tagPAP{
char len;
char res1;
char just;
}PAP,FAR* LPPAP;
// CHP3, CHP5 for .WRI file character information
typedef struct tagCHP3{
char len;
char res1;
unsigned char bold_it_fontLSBs;
char fontsiz;
}CHP3,FAR* LPCHP3;
typedef struct tagCHP5{
char len;
char res1;
unsigned char bold_it_fontLSBs;
char fontsiz;
char uline;
unsigned char fontMSBs;
}CHP5,FAR* LPCHP5;
/*
** Global Variables
*/
HANDLE instance=0;
HWND hwndSortorder;
HWND hwndDialog;
/* following are user choices to drive file generation */
SORTORDER sortorder=ALPHA;
MONOSPACE monospace=VARMONO;
int use_printer_context=0,allow_synthesis=0,truetype_only=0;
int incl_novelty=0,incl_modern=0,incl_roman=0,
incl_script=0,incl_sanserif=0,incl_other=0;
int incl_regular=0,incl_bold=0,incl_italic=0,incl_bolditalic=0;
int launchwrite=0;
/* following are for internal use of generate_file_from_options() */
static int successful_so_far,did_bailout;// error-occurred variable
static OPENFILENAME ofn;
static HFILE file=HFILE_ERROR;
static int fams; // font families in fonts
static LPTRACKFONT fonts[MAXFONTS];
static HDC hdc;
static FONTENUMPROC do_families,do_individuals;
/* following are for use of get_memory() and free_memory() */
static HGLOBAL mem_handles[MAXALLOCATIONS];
static int mem_handles_used=0,memory_system_restart=0;
// following set by dialog proc, used by generate_file_from_options()
LPSTR sample_text_ptr=0;
int sample_text_length=0;
int sample_text_pointsize=0; // in half-points (24==12pt)
int sample_text_just=0; // JUST_LEFT ... JUST_JUST
LPSTR default_font=0;
BYTE default_ffid=0;
int default_pointsize=0; // in half-points (24==12 pt)
int default_just=0; // JUST_LEFT ... JUST_JUST
int default_bolditalic=0; // BOLD_BIT | ITALIC_BIT
// generate_file_from_options() sets and uses for .WRI file:
LPTEXTQUEUE text_first,text_last;
LPTEXTQUEUE char_first,char_last;
LPTEXTQUEUE graf_first,graf_last;
LPTEXTQUEUE font_first,font_last;
long text_bytes,char_pages,graf_pages,font_pages;
int default_font_offset; // font code for default txt
/*
** Function Prototypes
*/
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInst,LPSTR cmd,int Show);
static void bailout(char *msg);
int CALLBACK _export families(LPENUMLOGFONT lpelf,TEXTMETRIC FAR* tmptr,
int fonttype,LPARAM lparam);
static LPSTR get_font_type(BYTE pitchandfamily);
int CALLBACK _export individuals(LPENUMLOGFONT lpelf,TEXTMETRIC FAR* tmptr,
int fonttype,LPARAM lparam);
#ifdef DEBUG
int mprintf(const char *fmt,...);
#endif
static void open_output_file(void);
static void gather_data(void);
static void sort_data(void);
static int sorter(const void* arg1,const void* arg2);
static void FAR* get_zeroed_memory(size_t size);
static void FAR* get_memory(size_t size);
static void free_memory(void);
static void generate_report(void);
static void w_init(void);
static void w_default(const char* fmt,...);
static void w_sample(LPTRACKFONT lpf,int bolditalic);
static int w_add_font(LPSTR name, BYTE ffid);
static void w_add_graf(int textlen,int just);
static void w_add_char(int textlen,int bolditalic,int fontcode,int size);
static void w_add_text(LPSTR text,int size);
static void write_data_file(void);
static int write_data_chunk(LPSTR buf,size_t buflen);
static void create_device_context(void);
static void get_user_options(void);
/*
** Function Definitions
*/
#ifdef DEBUG
#pragma argsused
// test scaffolding
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInst,LPSTR cmd,int Show){
_InitEasyWin();
instance=hInstance;
for(;;){
get_user_options();
if(wanna_quit)break;
generate_file_from_options();
}
return 0;
}
#endif
void generate_file_from_options(void){
// initialize global variables
do_families=do_individuals=NULL;
hdc=NULL;
successful_so_far=1;
did_bailout=0;
fams=0;
// ok, let's get to work
if(successful_so_far)gather_data();
if(successful_so_far)sort_data();
if(successful_so_far)generate_report();
if(successful_so_far)open_output_file();
if(successful_so_far)write_data_file();
if(successful_so_far)bailout(NULL);
else SetFocus(hwndSortorder);
}
// clean up, release memory, device context, etc.
static void bailout(char *msg){
if(did_bailout)return; // don't do this stuff twice
if(msg!=NULL){
MessageBox(hwndDialog,msg,"Error",MB_OK|MB_ICONEXCLAMATION);
successful_so_far=0;
}
if(hdc!=NULL){
DeleteDC(hdc);
hdc=NULL;
}
if(do_families!=NULL){
FreeProcInstance(do_families);
do_families=NULL;
}
if(do_individuals!=NULL){
FreeProcInstance(do_individuals);
do_individuals=NULL;
}
if(file!=HFILE_ERROR){
char buf[270];
_lclose(file);
file=HFILE_ERROR;
if(launchwrite&&successful_so_far){
wsprintf(buf,"WRITE %s",ofn.lpstrFile);
SetFocus(hwndSortorder);
WinExec(buf,SW_SHOWNORMAL);
}
}
free_memory();
}
// families() is the callback function passed to EnumFontFamilies()
// it's called for every font family. for each family of interest,
// families() calls EnumFontFamilies() with individuals() as the
// callback function. this gathers information on presence of
// bold, italic, etc. and puts it into fonts[]
#pragma argsused
int CALLBACK _export families(LPENUMLOGFONT lpelf,TEXTMETRIC FAR* tmptr,
int fonttype,LPARAM lparam){
if(fams==MAXFONTS){
// only nine bits available for font number, so .WRI file
// can't have more than 512 fonts
MessageBox(hwndDialog,"Due to limitations in the .WRI format, "
"only working with first 512 font families.\n\n"
"Assemble several reports to list all your fonts.",
"Too many fonts",MB_OK|MB_ICONINFORMATION);
return 0;
}
// if we don't want non-TT, don't gather this one...
if(truetype_only&&!(fonttype&TRUETYPE_FONTTYPE))return 1;
// if we don't want this font type, don't gather it...
switch(lpelf->elfLogFont.lfPitchAndFamily&~3){
case FF_DECORATIVE: if(!incl_novelty)return 1; break;
case FF_MODERN: if(